
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by yanli on 16/7/27.
 */
public class Common {
    public static final Logger logger = LoggerFactory.getLogger(Common.class);

    //应用令牌
    public static String accessToken = "";
    //起始时间
    public static String sinceString;
    //终止时间
    public static String untilString;
    //所要统计的时间段
    public static List<String> dates = new ArrayList<>();
    //所要统计的applist
    public static List<JSONObject> appJson;
    //生成报表的路径
    public static String excelFilePath = "";
    //生成报表的种类
    public static String excelFileType = "";
    //国家语言表路径
    public static List<JSONObject> regionJson;

    public static void init(String confPath){

        FileInputStream fileInputStream = null;
        String fileUrl = confPath + File.separator + "system.properties";
        File file = new File(fileUrl);
        try {
            fileInputStream = new FileInputStream(file);
            Properties p = new Properties();
            p.load(fileInputStream);

            String appJsonPath = p.getProperty("appJsonPath");
            String regionJsonPath = p.getProperty("regionFilePath");
            if (StringUtils.isNotBlank(appJsonPath)){
                //获取应用配置文件路径
                String appJsonString = FileUtils.getFileContent(appJsonPath);
                //获取国家配置文件路径
                String regionJsonString = FileUtils.getFileContent(regionJsonPath);
                if (StringUtils.isNotBlank(appJsonString) || StringUtils.isNotBlank(regionJsonPath)){
                    try {
                        appJson = JSONObject.parseArray(appJsonString, JSONObject.class);
                        regionJson = JSONObject.parseArray(regionJsonString, JSONObject.class);
                    }catch (Exception e){
                        logger.debug("应用配置文件的json格式错误,其为json数组,请检查格式!");
                        System.exit(0);//程序退出
                    }

                }else {
                    logger.debug("应用或者国家配置文件内容为空!");
                    System.exit(0);//程序退出
                }
            }else {
                logger.debug("应用或国家的json配置文件路径不能为空,请检查配置文件system.properties中的appJsonPath或regionFilePath字段!");
                System.exit(0);//程序退出
            }

            sinceString = p.getProperty("DATE_OF_SINCE");
            untilString = p.getProperty("DATE_OF_UNTIL");
            excelFilePath = p.getProperty("excelFilePath");
            excelFileType = p.getProperty("excelFileType");

            long sinceLong = getLongTime(sinceString);
            long untilLong = getLongTime(untilString);
            if (sinceLong > untilLong || sinceLong + untilLong == 0){
                logger.debug("配置文件时间出错,请检查配置文件system.properties中的DATE_OF_SINCE或DATE_OF_UNTIL字段!");
                System.exit(0);//程序退出
            }

            dates = Common.findDates();
        } catch (FileNotFoundException e) {
            logger.debug("系统文件system.properties找不到!");
            System.exit(0);//程序退出
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                logger.error("can not close" + file.getName());
            }
        }
    }

    public static void getAccessToken(JSONObject json){
        String appId = json.getString("appId");
        String appSecret = json.getString("appSecret");
        if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(appSecret)){
            String accessTokenUrl = Constants.accessTokenUrl.replace("APP_ID", appId).replace("APP_SECRET", appSecret);
            if(logger.isDebugEnabled()) {
                logger.debug("token url={}", accessTokenUrl);
            }
            if(!StringUtils.isNotBlank(accessTokenUrl)){
                return;
            }
            String jsonObject = "";
            try {
                jsonObject = URLAvailability.getResultFromURL(accessTokenUrl);//获取数据
                if(logger.isDebugEnabled()){
                    logger.debug(jsonObject);
                }
            } catch (Exception e){
                logger.error("get token error!",e);
            }
            accessToken = jsonObject.substring(13, jsonObject.length());
        } else {
            if (logger.isDebugEnabled()){
                logger.debug("未找到appId或client_secret");
            }
            return;
        }
    }

    public static long getLongTime(String time){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        long date = 0;
        try {
             date = dateFormat.parse(time).getTime()/1000;
        } catch (ParseException e) {
            logger.debug("时间"+time+"格式错误!如:2016-07-27");
        }
        return date;
    }

    /**
     * 获取某时间段的所有日期
     * @return
     */
    public static List<String> findDates() {
        SimpleDateFormat ymdFormater = new SimpleDateFormat("yyyy-MM-dd");
        Date dBegin = null;
        Date dEnd = null;
        try {
            dBegin = ymdFormater.parse(sinceString);
            dEnd = ymdFormater.parse(untilString);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        List<String> lDate = new ArrayList<>();
        lDate.add(ymdFormater.format(dBegin));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            lDate.add(ymdFormater.format(calBegin.getTime()));
        }
        return lDate;
    }
}
